テクニカル Q&A

QTMTB 52 - QuickTime 4 でメモリ上の WAVE データを再生する方法 (1999 年 8 月 21 日)


Q: QuickTime 4 でメモリ上にある WAVE データを再生する方法を教えてください。

A: QuickTime 4 には組み込みの WAV ファイルインポータがあります。まるで QuickTime のムービーファイルであるかのように、いとも簡単に WAV ファイルを開いて再生することができます。例えば次に示すのは、読者がそのまま利用できる、QuickTime で WAV ファイルを再生するコードです (ファイルプロンプトで WAV ファイルを選ぶと QuickTime は音だけのムービーとして再生します)。

OSErr PlayWAVfile ()
{
    SFTypeList        myTypeList;
    StandardFileReply myReply;
    OSErr             err = noErr;
    short             movieRefNum, resID = 0;
    Movie             movie;
         
        StandardGetFilePreview(NULL, -1, myTypeList, &myReply);
        if (!myReply.sfGood)
        {
            err = userCanceledErr;
            return err;
        }
        else
        {
            err = OpenMovieFile(&myReply.sfFile, &movieRefNum, fsRdPerm);
            if (!err)
            {
                err = NewMovieFromFile(&movie,
                                       movieRefNum,
                                       &resID,
                                       NULL,
                                       newMovieActive,
                                       NULL);
            }
         
            if (err)
            {
                if (movie)
                {
                    DisposeMovie(movie);
                }
            }
            else
            {
                SetMovieVolume(movie, kFullVolume);
                GoToBeginningOfMovie(movie);
                StartMovie(movie);
                while (!IsMovieDone(movie))
                {
                    MoviesTask(movie, 0);
                    err = GetMoviesError();
                }
            }
        }
         
        return err;
}

WAV データがファイルではなくメモリ上にある場合、WAV サウンドを QuickTime で再生するにはもう少し作業が必要です。このような場合、ひとつの方法は、新しいムービーを作成し、WAV データを別のサウンドトラックとして追加する方法です (QuickTime の WAV インポータはファイルにしか対応しないため)。『Inside Macintosh: QuickTime』第 2 章にはスクラッチレベルから新しいムービーを作成し、それにサウンドトラックを追加するサンプルコードがあります。同じ方法でムービーのサウンドトラックに WAV データを追加し、ムービーを再生することができます。

もうひとつの方法は、QuickTime の WAV ムービーインポートコンポーネントと MovieImportDataRef 関数を使って、メモリ上の WAV ファイルデータをムービーに追加する方法です。MovieImportDataRef 関数にはインポート操作で使用するデータ参照 (data reference) を指定します (この場合は WAV ファイルデータのデータ参照へのハンドル)。dataRef パラメータには、WAV データへのハンドルではなく、先頭のデータハンドルへのハンドルを渡すことに注意してください (以下のコードを参照)。

void ImportWAVDataFromMemory(Ptr waveDataPtr, long waveDataSize)
{
    Handle                  myHandle, dataRef = nil;
    Movie                   movie;
    MovieImportComponent    miComponent;
    Track                   targetTrack = nil;
    TimeValue               addedDuration = 0;
    long                    outFlags = 0;
    OSErr                   err;
    ComponentResult         result;
         
        myHandle = NewHandleClear((Size)waveDataSize);
        BlockMove(waveDataPtr,
                    *myHandle,
                    waveDataSize);
         
        err = PtrToHand(&myHandle,
                        &dataRef,
                        sizeof(Handle));
         
        miComponent = OpenDefaultComponent(MovieImportType,
                                            kQTFileTypeWave);
        movie = NewMovie(0);
         
        result = MovieImportDataRef(miComponent,
                                    dataRef,
                                    HandleDataHandlerSubType,
                                    movie,
                                    nil,
                                    &targetTrack,
                                    nil,
                                    &addedDuration,
                                    movieImportCreateTrack,
                                    &outFlags);
         
        SetMovieVolume(movie, kFullVolume);
        GoToBeginningOfMovie(movie);
        StartMovie(movie);
        while (!IsMovieDone(movie))
        {
            MoviesTask(movie, 0);
            err = GetMoviesError();
        }
}


-- Scott Kuechle
Worldwide Developer Technical Support

テクニカル Q&A | 目次

To contact us, please use the Contact Us page.